package org.tom.user.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.tom.basic.exception.MyException;
import org.tom.basic.util.SendMsg;
import org.tom.basic.util.StrUtils;
import org.tom.user.constant.UserConstant;
import org.tom.user.domain.User;
import org.tom.user.domain.WxUser;
import org.tom.user.mapper.UserMapper;
import org.tom.user.mapper.WxUserMapper;
import org.tom.user.service.IVerifycodeService;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private WxUserMapper wxUserMapper;

    /**
     * 获取验证码的方法
     * @param param
     */
    @Override
    public void smsCode(Map<String, String> param) {
        // 判断手机号码非空或者手机号是否符合规则
        if (StringUtils.isEmpty(param.get("phone")) || StringUtils.isEmpty(param.get("type"))) {
            throw new MyException("手机号不能为空");
        }
        //    判断手机号是否已经存在,注册的时候手机号不能重复，绑定的时候手机号重复，只需要将手机号和微信绑定就行
        User user = userMapper.findByPhone(param.get("phone"));
        if (user != null && param.get("type").equals("register")){
            throw new MyException("该手机号已经被注册过");
        } else if(user != null && param.get("type").equals("binder")) {  // 一个手机号只能绑定一个手机，判断是否有绑定过微信号
            WxUser wxUser = wxUserMapper.loadByUserId(user.getId());
            if (wxUser != null){
                throw new MyException("该手机号绑定过微信");
            }
        }
        Object redisVerif = null;
        // 判断业务的类型，注册还是绑定
        if (param.get("type").equals("register")){
            //  三分钟过期，从redis中取，取到就没有过期, key：业务标识+手机号
            redisVerif = redisTemplate.opsForValue().get(UserConstant.REGISTER_PREFIX + param.get("phone"));

        }else if (param.get("type").equals("binder")){
            //  三分钟过期，从redis中取，取到就没有过期, key：业务标识+手机号
            redisVerif = redisTemplate.opsForValue().get(UserConstant.BINDER_PREFIX + param.get("phone"));
        }
        String code = null;
        if (redisVerif != null){
            //  判断当前验证码是否超过一分钟，没有超过一分钟，直接抛异常，提示：验证码已经发送，请勿频繁操作
            //   value：时间戳+":"code
            String time = redisVerif.toString().split(":")[0];

            if (System.currentTimeMillis()-Long.valueOf(time)<60000){
                throw new MyException("验证码已经发送，请勿重复操作");
            }else {  //  超过一分钟，重新刷新之前验证码的过期时间，由于该操作和取不到验证码的情况一样就放在最后写
                code = redisVerif.toString().split(":")[1];
            }

        }else {
            //   如果取不到，重新生成验证码 。由于该操作和刷新验证码的情况一样就放在最后写
            code = StrUtils.getComplexRandomString(4);
        }
        //   value 3个参数 验证码， 过期时间值， 时间单位
        if (param.get("type").equals("register")){
            redisTemplate.opsForValue().set(UserConstant.REGISTER_PREFIX + param.get("phone"),
                    System.currentTimeMillis() + ":" + code,
                    3L,
                    TimeUnit.MINUTES);
        } else if (param.get("type").equals("binder")){
            redisTemplate.opsForValue().set(UserConstant.BINDER_PREFIX + param.get("phone"),
                    System.currentTimeMillis() + ":" + code,
                    3L,
                    TimeUnit.MINUTES);
        }

//        SendMsg.sendSMS(phone, "验证码"+code+"三分钟内填写");
        // System.out.println(redisTemplate.opsForValue().get(UserConstant.BINDER_PREFIX + param.get("phone")));
        System.out.println(code);

    }
}
